from mfrc522 import MFRC522  # 导入RFID库MFRC522
from os import uname  # 获取系统信息
from time import sleep  # 延迟函数，用于设置循环检测间隔


# 创建MFRC522对象，初始化RFID读卡器模块的引脚
# 参数分别为: sck引脚, mosi引脚, miso引脚, rst引脚(空), cs(sda)引脚
rfid = MFRC522(0, 2, 4, 5, 14)


def write_data(block_num):
    """
    向RFID卡片的指定block写入数据，并验证写入是否成功。
    :param block_num: 指定操作的块号，范围为0到63。
    """
    while True:
        # 发送卡片检测请求，REQIDL用于检测卡片进入天线区
        stat, tag_type = rfid.request(rfid.REQIDL)
        print("检测卡片中...")  # 提示用户卡片检测过程

        # 如果检测到卡片
        if stat == rfid.OK:
            # 防冲突检测，提取卡片的唯一ID号（UID）
            stat, raw_uid = rfid.anticoll()

            # 如果成功提取到卡片的UID
            if stat == rfid.OK:
                print("检测到卡片: ")
                print("  -  类型: 0x%02x" % tag_type)
                print("  -  ID号: 0x%02x%02x%02x%02x" % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))

                # 选择卡片，准备与其进行交互
                if rfid.select_tag(raw_uid) == rfid.OK:
                    # 使用默认密钥 0xFF 进行认证
                    key = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]

                    # 验证指定block
                    if rfid.auth(rfid.AUTHENT1A, block_num, key, raw_uid) == rfid.OK:
                        # 写入数据，数据为16字节 (0x00到0x0F的值)
                        data_to_write = b"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
                        stat = rfid.write(block_num, data_to_write)

                        # 检查写入是否成功
                        if stat == rfid.OK:
                            print("数据已成功写入卡片的block %d" % block_num)
                        else:
                            print("错误: 数据写入失败...")

                        # 操作完成，释放卡片
                        rfid.stop_crypto1()
                    else:
                        print("错误: 密码验证失败...")
                else:
                    print("错误: 卡片选择失败...")

        # 每次检测后等待一秒，避免频繁检测
        sleep(1)


if __name__ == '__main__':
    # 主程序，尝试向RFID卡片的第2块 (block 2) 写入数据
    write_data(2)
